package com.itheima.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.mapper.EmpExprMapper;
import com.itheima.mapper.EmpMapper;
import com.itheima.pojo.*;
import com.itheima.service.EmpLogService;
import com.itheima.service.EmpService;
import com.itheima.util.JwtUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class EmpServiceImpl implements EmpService {

    @Autowired
    private EmpMapper empMapper;

    @Autowired
    private EmpExprMapper empExprMapper;

    @Autowired
    private EmpLogService empLogService;


    @Override
    public LoginInfo login(Emp emp) {
        Emp emplogin= empMapper.login(emp);
        if (emplogin!=null){
            Map<String,Object> dataMap= new HashMap<>();
            dataMap.put("id",emplogin.getId());
            dataMap.put("username",emplogin.getUsername());
            String jwt=JwtUtils.generateJwt(dataMap);
            // 将 Jwt 放入 ThreadLocal
            //CurrentHolderJwt.setCurrentJwt(jwt);
            LoginInfo loginInfo= new LoginInfo(emplogin.getId(),emplogin.getUsername(),emplogin.getName(),jwt);
            return loginInfo;
        }

        return null;
    }

    /***
     * 查询所有员工
     * @return
     */
    @Override
    public List<Emp> list() {
        return empMapper.list(null);
    }




    /***
     * 根据员工ID修改员工信息
     * @param emp
     */
    @Override
    public void update(Emp emp) {
        //1、根据ID修改员工信息
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.updateById(emp);

        //2、删除该员工的工作经历记录  Arrays.asList(...)
        List<Integer> ids = Arrays.asList(emp.getId());
        empExprMapper.deleteByEmpIds(ids);

        //3、批量新增该员工的工作经历
        List<EmpExpr> exprList = emp.getExprList();
        if(exprList!=null){
            exprList.forEach(e->e.setEmpId(emp.getId()));
            empExprMapper.insertBatch(exprList);
        }
    }


    /****
     * 查询员工信息
     * @param id
     * @return
     */
    @Override
    public Emp getInfo(Integer id) {
        return empMapper.getById(id);
    }


    /***
     * 删除员工信息
     * @param ids
     */
    @Override
    public void delete(List<Integer> ids) {
        //删除员工信息（emp表）
        empMapper.deleteByIds(ids);

        //删除员工工作经历(emp_expr)
        empExprMapper.deleteByEmpIds(ids);
    }


    /***
     * 新增员工信息（包含员工工作经历）
     * @param emp
     */
    @Transactional(rollbackFor = {Exception.class})
    @Override
    public void save(Emp emp) throws Exception {
        //1、完善时间信息
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());

        try {
            //2、新增员工信息-新增之后，有主键ID，就是员工ID(要获取员工ID)
            empMapper.insert(emp);

            //制造异常
            //int q = 10 / 0;

            //3、新增员工工作经历
            List<EmpExpr> exprList = emp.getExprList();
            if (exprList != null) {
                //员工ID
                Integer empId = emp.getId();
                //要给每个员工工作经历的员工ID设置值
                exprList.forEach(empExpr -> empExpr.setEmpId(empId));
                //批量新增
                empExprMapper.insertBatch(exprList);
            }
        } finally {
            //日志记录
            EmpLog empLog = new EmpLog(null,LocalDateTime.now(),"新增员工信息:"+emp.getId());
            empLogService.insertLog(empLog);
        }
    }


    /***
     * 分页查询
     * @return
     */
    @Override
    public PageResult page(EmpQueryParam empQueryParam) {
        //1、分页设置
        PageHelper.startPage(empQueryParam.getPage(), empQueryParam.getPageSize());

        //2、执行查询
        List<Emp> list = empMapper.list(empQueryParam);
        Page<Emp> pageList = (Page<Emp>) list;

        //3、封装PageResult对象
        return new PageResult(pageList.getTotal(), list);
    }


    //未封装备份
    public PageResult pagebackup(Integer page, Integer pageSize, String name, Integer gender, LocalDate begin, LocalDate end) {
        //1、分页设置
        PageHelper.startPage(page, pageSize);

        //2、执行查询
        List<Emp> list = null;//empMapper.list(name,gender,begin,end);
        Page<Emp> pageList = (Page<Emp>) list;

        //3、封装PageResult对象
        return new PageResult(pageList.getTotal(), list);
    }


    //非PageHeler的分页代码
    public PageResult pageBackup(Integer page, Integer pageSize) {
        //1、查询总数量
        //Long total = empMapper.count();

        //2、计算查询的起始索引
        //Integer start = (page-1)*pageSize;

        //3、执行查询
        //List<Emp> list = empMapper.list(start,pageSize);

        //4、封装PageResult对象
        //return new PageResult(total,list);
        return null;
    }
}
